package extenstion

/**
 * 学习扩展
 *
 * 描述：
 *
 * 扩展是静态解析的
 * 扩展不能真正的修改他们所扩展的类。通过定义一个扩展，你并没有在一个类中插入新成员， 仅仅是可以通过该类型的变量用点表达式去调用这个新函数。
 *
 */

open class C

class D : C()

//扩展方法
fun C.foo() = "C foo"

//扩展方法
fun D.foo() = "D foo"

fun printlnFoo(c: C) {
    //扩展函数调用是根据调用者本身类型所决定的
    //此处c实例为C类型，所以不管是传入C实例还是D实例输出结果都为"C foo"
    println(c.foo())
}

/**
 * 此方法开启后，D.foo才会被调用
 */
//fun printlnFoo(d: D) {
//    println(d.foo())
//}

fun main(args: Array<String>) {

    printlnFoo(C())
    printlnFoo(D())
}